namespace System.Threading.Tasks;

public static class TaskExtensions
{
    /// <summary>
    /// 当委托是返回 <see cref="Task"/> 的 <see cref="Func{TIn, TResult}"/> 时，<see cref="MulticastDelegateExtensions.InvokeAsync{TDelegate}"/> 的快捷方式。
    /// </summary>
    public static Task InvokeFuncAsync<TIn>(this Func<TIn, Task> @delegate, TIn argument) =>
        @delegate.InvokeAsync<Func<TIn, Task>>(func => func(argument));

    /// <summary>
    /// 通过释放并丢弃其结果，将返回 <see cref="IDisposable"/> 实例的 <see cref="Task{TResult}"/> 转换为 <see cref="Task"/>。
    /// </summary>
    public static Task DisposeResultAsync<T>(this Task<T> task)
        where T : IDisposable =>
        task.ContinueWith(
            finishedTask => finishedTask.Result?.Dispose(),
            TaskScheduler.Current);
}
